package cn.tedu.mall.order.service.impl;

import cn.tedu.mall.common.exception.CoolSharkServiceException;
import cn.tedu.mall.common.pojo.domain.CsmallAuthenticationInfo;
import cn.tedu.mall.common.restful.JsonPage;
import cn.tedu.mall.common.restful.ResponseCode;
import cn.tedu.mall.order.mapper.OmsCartMapper;
import cn.tedu.mall.order.service.IOmsCartService;
import cn.tedu.mall.pojo.order.dto.CartAddDTO;
import cn.tedu.mall.pojo.order.dto.CartUpdateDTO;
import cn.tedu.mall.pojo.order.model.OmsCart;
import cn.tedu.mall.pojo.order.vo.CartStandardVO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class OmsCartServiceImpl implements IOmsCartService {
    @Autowired
    private OmsCartMapper omsCartMapper;

    //添加商品到购物车
    @Override
    public void addCart(CartAddDTO cartDTO) {
        //获取当前登录用户的id
        Long userId = getUserId();
        //查询这个用户是否已经将指定的sku添加到购物车中了
        OmsCart omsCart = omsCartMapper.selectExistsCart(userId, cartDTO.getSkuId());
        //判断omsCart是否为null
        if(omsCart==null){
            //如果当前omsCart为null，就说明是新增操作
            //需要将cartDTO转成需要的OmsCart对象
            OmsCart newOmsCart = new OmsCart();
            BeanUtils.copyProperties(cartDTO,newOmsCart);
            //赋值userId
            newOmsCart.setUserId(userId);
            //执行新增
            omsCartMapper.saveCart(newOmsCart);
        }else{
            //指定的商品已经在购物车了，需要执行新增操作
            //需要将cartDTO和omsCart的数量相加
            omsCart.setQuantity(cartDTO.getQuantity()+omsCart.getQuantity());
            //执行修改操作
            omsCartMapper.updateQuantityById(omsCart);
        }
    }

    //分页查询购物车中的商品
    @Override
    public JsonPage<CartStandardVO> listCarts(Integer page, Integer pageSize) {
        //根据userId进行查询
        Long userId = getUserId();
        //PageHelper设置分页条件
        PageHelper.startPage(page,pageSize);
        //刚刚写的sql中没有limit关键字，PageHelper会在sql末尾自动添加
        List<CartStandardVO> cartStandardVOS = omsCartMapper.selectCartsByUserId(userId);
        //将分页结果和分页信息进行返回，返回类型为JsonPage
        return JsonPage.restPage(new PageInfo<>(cartStandardVOS));
    }

    //根据选择的商品进行删除
    @Override
    public void removeCart(Long[] ids) {
        int rows = omsCartMapper.deleteCartsByIds(ids);
        //如果rows==0，说明删除失败
        if(rows==0)
            throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,"您要删除的商品不存在");
    }
    //一键清空当前用户的购物车
    @Override
    public void removeAllCarts() {
        int rows = omsCartMapper.deleteCartsByUserId(getUserId());
        if(rows==0)
            throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,"您的购物车中没有商品");
    }
    //根据userId和skuId删除选择的商品
    @Override
    public void removeUserCarts(OmsCart omsCart) {
        omsCartMapper.deleteCartByUserIdAndSkuId(omsCart);
    }
    //修改购物车中指定商品的数量
    @Override
    public void updateQuantity(CartUpdateDTO cartUpdateDTO) {
        //需要将cartUpdateDTO转成omsCart类型的对象
        OmsCart omsCart = new OmsCart();
        BeanUtils.copyProperties(cartUpdateDTO,omsCart);
        omsCartMapper.updateQuantityById(omsCart);
    }

    //业务逻辑层总是需要获取用户信息的，所以单独写一个方法来获取用户信息
    //通过Security的上下文对象来获取
    public CsmallAuthenticationInfo getUserInfo(){
        //获取Security上下文对象，通过上下文对象获取token
        UsernamePasswordAuthenticationToken token =
                (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext()
                        .getAuthentication();
        //判断token是否为空
        if(token==null)
            throw new CoolSharkServiceException(ResponseCode.UNAUTHORIZED,"没有登录信息");
        //从token中获取用户信息
        CsmallAuthenticationInfo userInfo =
                (CsmallAuthenticationInfo) token.getCredentials();
        //返回用户信息
        return userInfo;
    }
    //获取userId的方法也是很常见的
    public Long getUserId(){
        return getUserInfo().getId();
    }
}
